#include "myhead.h"

/*
	tcp双向通信
	客户端的代码
	用多路复用实现双向通信
*/


int main(int argc,char **argv)
{
	int tcpsock;
	int ret;
	char rbuf[100];
	char buf[100];
	//定义ipv4地址结构体变量存放绑定的ip和端口号
	struct sockaddr_in bindaddr;
	bzero(&bindaddr,sizeof(bindaddr));
	bindaddr.sin_family=PF_INET;
	bindaddr.sin_addr.s_addr=inet_addr("192.168.19.3"); //绑定男朋友自己的ip，需要转换大小端
	bindaddr.sin_port=htons(atoi(argv[1])); //绑定男朋友自己的端口号
	
	//定义ipv4地址结构体变量存放对方(女朋友)的ip和端口号
	struct sockaddr_in girladdr;
	bzero(&girladdr,sizeof(girladdr));
	girladdr.sin_family=PF_INET;
	girladdr.sin_addr.s_addr=inet_addr("192.168.19.3"); //女朋友的ip，需要转换大小端
	girladdr.sin_port=htons(atoi(argv[2])); //女朋友的端口号
	
	//创建tcp套接字
	tcpsock=socket(AF_INET,SOCK_STREAM,0);
	if(tcpsock==-1)
	{
		perror("创建tcp失败");
		return -1;
	}
	
	//绑定ip和端口号
	ret=bind(tcpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
	if(ret==-1)
	{
		perror("绑定失败!\n");
		return -1;
	}
	
	//连接女朋友
	ret=connect(tcpsock,(struct sockaddr *)&girladdr,sizeof(girladdr));
	if(ret==-1)
	{
		perror("连接失败!\n");
		return -1;
	}
	
	//定义文件描述符集合变量
	fd_set myset;
	
	//定义超时时间
	struct timeval  mytime;
	bzero(&mytime,sizeof(mytime));
	mytime.tv_sec=3; //超时时间设置为3秒
	
	//调用select去监测刚才两个文件描述符
	while(1) 
	{
		//清空集合
		FD_ZERO(&myset);
		//往集合中添加我要监测的文件描述符
		FD_SET(0,&myset); //添加键盘
		FD_SET(tcpsock,&myset); //添加套接字
		printf("如果你3秒钟不敲键盘，对方也不给你发送信息过来，扑街了，会一直阻塞在select的位置!\n");
		ret=select(tcpsock+1,&myset,NULL,NULL,NULL);
		if(ret>0) //监测成功
		{
			//判断键盘在不在集合
			if(FD_ISSET(0,&myset)) //说明你从键盘输入了内容,键盘发生了读就绪
			{
				printf("同学，键盘真的发生了读就绪!!!\n");
				bzero(buf,100);
				scanf("%s",buf);
				send(tcpsock,buf,strlen(buf),0);
			}
			//判断套接字在不在集合
			if(FD_ISSET(tcpsock,&myset)) //说明套接字发生了读就绪(有数据来了，可读)
			{
				//接收服务器发送过来的信息
				bzero(rbuf,100);
				recv(tcpsock,rbuf,100,0);
				printf("服务器发送过来的信息是：%s\n",rbuf);
			}
		}
		else if(ret<0)
		{
			perror("select失败");
			return -1;
		}
		else
		{
			perror("对不起，你一直不敲键盘，我就不跟你玩了!\n");
		}
	}
	
	//关闭
	close(tcpsock);
	return 0;
}